package org.itheima.googleplay.ui.holder;

import org.itheima.googleplay.R;
import org.itheima.googleplay.bean.AppInfoBean;
import org.itheima.googleplay.bean.DownloadBean;
import org.itheima.googleplay.manager.DownloadManager;
import org.itheima.googleplay.manager.DownloadManager.DownloadObserver;
import org.itheima.googleplay.ui.weiget.ProgressButton;
import org.itheima.googleplay.utils.UIUtils;

import android.view.View;
import android.view.View.OnClickListener;

import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;

/**
 * @包名: org.itheima.googleplay.ui.holder
 * @类名: AppDetailDownloadHolder
 * @作者: 肖琦
 * @创建时间 : 2015-3-24 下午2:40:11
 * 
 * @描述: 详情页面下载部分
 * 
 * @SVN版本: $Rev: 22 $
 * @更新人: $Author: xq $
 * @更新时间: $Date: 2015-03-26 13:36:49 +0800 (星期四, 26 三月 2015) $
 * 
 * @更新描述:
 */
public class AppDetailDownloadHolder extends BaseHolder<AppInfoBean> implements OnClickListener, DownloadObserver
{
	@ViewInject(R.id.app_detail_download_btn_download)
	private ProgressButton	mPbDownload;

	private AppInfoBean		mInfoBean;

	private DownloadManager	mDownloadManager;

	private DownloadBean	mDownloadInfo;		// 下载的信息

	@Override
	protected View initView()
	{
		View view = View.inflate(UIUtils.getContext(), R.layout.app_detail_download, null);

		// 注入
		ViewUtils.inject(this, view);

		mPbDownload.setOnClickListener(this);

		// 下载的管理者
		mDownloadManager = DownloadManager.getInstance();

		return view;
	}

	@Override
	protected void refreshUI(AppInfoBean data)
	{
		// 数据接收
		this.mInfoBean = data;

		// 获取下载的状态
		mDownloadInfo = mDownloadManager.getCurrentState(mInfoBean);

		// 根据状态更新UI
		safeRefreshView(mDownloadInfo);
	}

	@Override
	public void onClick(View v)
	{
		if (v == mPbDownload)
		{
			clickDownloadButton();
		}
	}

	/**
	 * 开始观察
	 */
	public void startObserver()
	{
		mDownloadManager.addObserver(this);

		// 获取下载的状态
		mDownloadInfo = mDownloadManager.getCurrentState(mInfoBean);

		// 根据状态更新UI
		safeRefreshView(mDownloadInfo);
	}

	/**
	 * 停止观察
	 */
	public void stopObserver()
	{
		mDownloadManager.deleteObserver(this);
	}

	private void refreshView()
	{
		// 根据状态来显示
		// 1. 未下载 -----> 用户提示： 下载
		// 2. 等待状态----> 用户提示： 等待中...
		// 3. 下载中 -----> 用户提示： 显示进度
		// 4. 暂停 ------> 用户提示： 继续下载
		// 5. 下载成功----> 用户提示： 安装
		// 6. 下载失败----> 用户提示： 重试
		// 7. 已经安装 ---> 用户提示： 打开
		int downloadState = mDownloadInfo.downloadState;

		mPbDownload.setBackgroundResource(R.drawable.progress_btn_normal_bg);

		switch (downloadState)
		{
			case DownloadManager.STATE_DOWNLOADING:
				// 下载中 -----> 用户提示： 显示进度
				// 0-100
				int progress = (int) (mDownloadInfo.currenDownloadLength * 100f / mDownloadInfo.size + 0.5f);
				mPbDownload.setText(progress + "%");
				mPbDownload.setProgress(progress);
				mPbDownload.setBackgroundResource(R.drawable.progress_btn_loading_bg);
				break;
			case DownloadManager.STATE_INSTALLED:
				// 已经安装 ---> 用户提示： 打开
				mPbDownload.setText("打开");
				break;
			case DownloadManager.STATE_NONE:
				// 未下载 -----> 用户提示： 下载
				mPbDownload.setText("下载");
				break;
			case DownloadManager.STATE_FAILED:
				// 下载失败----> 用户提示： 重试
				mPbDownload.setText("重试");
				break;
			case DownloadManager.STATE_PAUSE:
				// 暂停 ------> 用户提示： 继续下载
				mPbDownload.setText("继续下载");
				break;
			case DownloadManager.STATE_SUCCESS:
				// 下载成功----> 用户提示： 安装
				mPbDownload.setText("安装");
				break;
			case DownloadManager.STATE_WAITING:
				// 等待状态----> 用户提示： 等待中...
				mPbDownload.setText("等待中...");
				break;
			default:
				break;
		}

	}

	/**
	 * 点击按钮操作
	 */
	private void clickDownloadButton()
	{
		// 根据状态来处理事情
		int downloadState = mDownloadInfo.downloadState;

		switch (downloadState)
		{
			case DownloadManager.STATE_DOWNLOADING:
				// 下载中，点击时，需要暂停
				doPause();
				break;
			case DownloadManager.STATE_INSTALLED:
				// 已经安装，点击时需要打开
				doOpen();
				break;
			case DownloadManager.STATE_NONE:
			case DownloadManager.STATE_FAILED:
			case DownloadManager.STATE_PAUSE:
				// 未下载,失败--> 去下载
				doDownload();
				break;
			case DownloadManager.STATE_SUCCESS:
				// 下载成功，等待安装
				doInstall();
				break;
			case DownloadManager.STATE_WAITING:
				// 等待时，不做任何处理
				break;
			default:
				break;
		}
	}

	/**
	 * 下载
	 */
	private void doDownload()
	{
		mDownloadManager.download(mInfoBean);
	}

	/**
	 * 去安装
	 */
	private void doInstall()
	{
		mDownloadManager.install(mInfoBean);
	}

	/**
	 * 去打开
	 */
	private void doOpen()
	{
		mDownloadManager.open(mInfoBean);
	}

	/**
	 * 暂停下载
	 */
	private void doPause()
	{
		mDownloadManager.pause(mInfoBean);
	}

	@Override
	public void onDownloadStateChange(DownloadManager manager, DownloadBean data)
	{
		// 子线程中执行的

		if (data.packageName.equals(mInfoBean.packageName))
		{
			// UI更新
			safeRefreshView(data);
		}

	}

	@Override
	public void onDownloadProgressChange(DownloadManager manager, DownloadBean data)
	{
		// 子线程中执行的

		if (data.packageName.equals(mInfoBean.packageName))
		{
			// UI更新
			safeRefreshView(data);
		}
	}

	private void safeRefreshView(final DownloadBean data)
	{
		UIUtils.runOnUiThread(new Runnable() {

			@Override
			public void run()
			{
				// UI更新
				mDownloadInfo = data;
				refreshView();
			}
		});
	}

}
